Authored: Kathy N. Lam

Updated: April 29, 2020


Set up

library(flowCore) #for reading and manipulating flow data
library(ggcyto) #for using ggplot with flow data
## Loading required package: ggplot2
## Loading required package: ncdfFlow
## Loading required package: RcppArmadillo
## Loading required package: BH
## Loading required package: flowWorkspace
library(scales) #for nice plot axes
library(cowplot) #for multi panel plots
## 
## ********************************************************
## Note: As of version 1.0.0, cowplot does not change the
##   default ggplot2 theme anymore. To recover the previous
##   behavior, execute:
##   theme_set(theme_cowplot())
## ********************************************************
library(Phenoflow) #for rarefying
## Loading required package: flowClean
## Loading required package: flowFDA
## Loading required package: flowViz
## Loading required package: lattice
## Loading required package: flowFP
## Loading required package: multcomp
## Loading required package: mvtnorm
## Loading required package: survival
## Loading required package: TH.data
## Loading required package: MASS
## 
## Attaching package: 'TH.data'
## The following object is masked from 'package:MASS':
## 
##     geyser
## Loading required package: mclust
## Package 'mclust' version 5.4.5
## Type 'citation("mclust")' for citing this R package in publications.
## 
## Attaching package: 'mclust'
## The following object is masked from 'package:mvtnorm':
## 
##     dmvnorm
## 
## Attaching package: 'flowFDA'
## The following object is masked from 'package:mclust':
## 
##     print.Mclust
## Loading required package: flowAI
## Loading required package: foreach
library(tidyverse) #for data wrangling and plotting
## ── Attaching packages ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── tidyverse 1.3.0 ──
## ✔ tibble  2.1.3     ✔ dplyr   0.8.5
## ✔ tidyr   1.0.2     ✔ stringr 1.4.0
## ✔ readr   1.3.1     ✔ forcats 0.5.0
## ✔ purrr   0.3.3
## ── Conflicts ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ ggcyto::%+%()       masks ggplot2::%+%()
## ✖ purrr::accumulate() masks foreach::accumulate()
## ✖ readr::col_factor() masks scales::col_factor()
## ✖ purrr::discard()    masks scales::discard()
## ✖ dplyr::filter()     masks ncdfFlow::filter(), flowCore::filter(), stats::filter()
## ✖ dplyr::lag()        masks stats::lag()
## ✖ purrr::map()        masks mclust::map()
## ✖ dplyr::select()     masks MASS::select()
## ✖ purrr::when()       masks foreach::when()
#for geom_jitter reproducibility
set.seed=100


Read data

(fs = read.flowSet(path="data_fcs"))
## A flowSet with 100 experiments.
## 
##   column names:
##   530/30 Blue B-A 610/20 YG C-A FSC-A FSC-H FSC-W SSC-A SSC-H SSC-W Time
colnames(fs) 
## [1] "530/30 Blue B-A" "610/20 YG C-A"   "FSC-A"           "FSC-H"          
## [5] "FSC-W"           "SSC-A"           "SSC-H"           "SSC-W"          
## [9] "Time"
pData(phenoData(fs))
#read in sample info
metadata = read_tsv("metadata.tsv") %>%
    rename(name=Filename) %>%
    mutate(Mouse = paste("Mouse", Mouse)) %>%
    mutate(Day = paste("Day", Timepoint)) %>%
    mutate(Treatment_Mouse = paste0(Treatment, "\n", Mouse)) %>%
    mutate(Mouse_Treatment = paste0(Mouse, " (", Treatment, ")"))
## Parsed with column specification:
## cols(
##   FlowSampleNumber = col_double(),
##   `Mouse Sample Number` = col_double(),
##   Experiment = col_character(),
##   Treatment = col_character(),
##   Mouse = col_double(),
##   Timepoint = col_double(),
##   Processing = col_character(),
##   CollectEvents = col_character(),
##   Filename = col_character(),
##   Notes = col_logical()
## )
metadata$Mouse = factor(metadata$Mouse, levels=unique(metadata$Mouse))
metadata$Treatment_Mouse = factor(metadata$Treatment_Mouse, levels=unique(metadata$Treatment_Mouse))
metadata$Treatment = factor(metadata$Treatment, levels=unique(metadata $Treatment))
metadata$Day = factor(metadata$Day, levels=unique(metadata$Day))
metadata
#add columns to phenoData  
phenoData(fs)$Order = seq(1, length(phenoData(fs)$name))
phenoData(fs)$Treatment = metadata$Treatment
phenoData(fs)$Timepoint = metadata$Timepoint
phenoData(fs)$Day = metadata$Day
phenoData(fs)$Name = metadata$name
phenoData(fs)$Mouse = metadata$Mouse
phenoData(fs)$Treatment_Mouse = metadata$Treatment_Mouse
phenoData(fs)$Mouse_Treatment = metadata$Mouse_Treatment
pData(phenoData(fs))
#make labeller function for facet_wrap
order = as.character(phenoData(fs)$Order)
name = phenoData(fs)$Name

order_names = mapply(c, order, name, SIMPLIFY = FALSE) #make a one-to-one 
order_names = lapply(order_names, `[[`, 2) #keep second element of each vector in the list
order_names = order_names[as.character(sort(as.numeric(names(order_names))))] #numerically sort 

order_labeller = function(variable,value){
  return(order_names[value])
}


Gate on scatter

scatter = rbind(c(0,   1e4), 
                c(1e5, 1e4),
                c(1e5, 2.5e5),  
                c(0,   2.5e5))
colnames(scatter)=c("FSC-A", "SSC-A")
scatter = as.data.frame(scatter)

ggplot() + 
    geom_point(data=fs, aes(x=`FSC-A`, y=`SSC-A`), shape=16, size=0.75, alpha=0.5) +
    scale_y_continuous(name="SSC-A (Granularity)\n", limits = c(-2e1,3e5)) +
    scale_x_continuous(name="\nFSC-A (Size)", limit=c(-2e1,3e5)) +
    facet_grid(Mouse~Timepoint) +
    theme_linedraw(14) +
    theme(panel.grid = element_blank(), axis.text.x=element_text(angle=90,hjust=1)) +
    geom_polygon(data=scatter, aes(x=`FSC-A`, y=`SSC-A`), fill=NA, colour="indianred", size=0.5,  linetype="solid") 
## Warning: Removed 29191 rows containing missing values (geom_point).


gate_scatter = polygonGate(filterId="scatter", `FSC-A` = scatter$`FSC-A`, `SSC-A` = scatter$`SSC-A`) 
result = flowCore::filter(fs, gate_scatter)
events = flowCore::Subset(fs, result)


Rarefy

events = Phenoflow::FCS_resample(events, replace = FALSE, rarefy = FALSE, progress = TRUE)
## Your samples range between 57249 and 90877 cells
## Your samples were randomly subsampled to 57249 cells


Gate on fluoresence

red = rbind(
    c(-1e3,   4e3),
    c(-1e3,   4e5),
    c( 4000,  4e5),
    c( 1000,  4e3))
colnames(red)=c("530/30 Blue B-A", "610/20 YG C-A")
red = as.data.frame(red)

green = rbind(
    c(9e2,   -1e3),
    c(4.5e3,  800),
    c(1.5e5,    800),
    c(1.5e5,   -1e3))
colnames(green)=c("530/30 Blue B-A", "610/20 YG C-A")
green = as.data.frame(green)

ggplot() + 
    geom_polygon(data=green, aes(x=`530/30 Blue B-A`, y=`610/20 YG C-A`), fill=NA, colour="green4", size=0.5, linetype="solid") +
    geom_polygon(data=red, aes(x=`530/30 Blue B-A`, y=`610/20 YG C-A`), fill=NA, colour="red3", size=0.5, linetype="solid") +
    geom_point(data=events, aes(x=`530/30 Blue B-A`, y=`610/20 YG C-A`), shape=16, size=0.5, alpha=0.2) +
    theme_linedraw(12) +
    scale_y_logicle(name="mCherry intensity\n",  t=10000, m=3, w=1, breaks=c(0, 1e3,1e4,1e5), limits=c(-1e3, 4e5)) +
    scale_x_logicle(name="\nGFP intensity",  t=10000, m=3, w=1, breaks=c(0, 1e3,1e4,1e5), limits=c(-1e3, 1.5e5)) +
    theme(panel.grid = element_blank(), 
          axis.title.x = element_text(colour="green4"), 
          axis.title.y = element_text(colour="red3")) +
    facet_grid(Mouse~Timepoint)  
## Warning: Removed 53 rows containing missing values (geom_point).

gate_green = polygonGate(filterId="green", `530/30 Blue B-A` = green$`530/30 Blue B-A`, `610/20 YG C-A` = green$`610/20 YG C-A`)
result_green = flowCore::filter(events, gate_green)
events_green = Subset(events, result_green)
gate_red = polygonGate(filterId="red", `530/30 Blue B-A` = red$`530/30 Blue B-A`, `610/20 YG C-A` = red$`610/20 YG C-A`)
result_red = flowCore::filter(events, gate_red)
events_red = Subset(events, result_red)
percent_red = toTable(summary(result_red)) %>% 
    mutate(x = 1e5, y = 3e4, colour="red", order=phenoData(events)$order) %>%
    rename(name=sample) %>%
    left_join(metadata, by="name")
## filter summary for frame 'Specimen_001_Sample_001_001.fcs'
##  red+: 5 of 57249 events (0.01%)
## 
## filter summary for frame 'Specimen_001_Sample_002_002.fcs'
##  red+: 2122 of 57249 events (3.71%)
## 
## filter summary for frame 'Specimen_001_Sample_003_003.fcs'
##  red+: 3444 of 57249 events (6.02%)
## 
## filter summary for frame 'Specimen_001_Sample_004_004.fcs'
##  red+: 853 of 57249 events (1.49%)
## 
## filter summary for frame 'Specimen_001_Sample_005_005.fcs'
##  red+: 89 of 57249 events (0.16%)
## 
## filter summary for frame 'Specimen_001_Sample_006_006.fcs'
##  red+: 2 of 57249 events (0.00%)
## 
## filter summary for frame 'Specimen_001_Sample_007_007.fcs'
##  red+: 6068 of 57249 events (10.60%)
## 
## filter summary for frame 'Specimen_001_Sample_008_008.fcs'
##  red+: 2322 of 57249 events (4.06%)
## 
## filter summary for frame 'Specimen_001_Sample_009_009.fcs'
##  red+: 24727 of 57249 events (43.19%)
## 
## filter summary for frame 'Specimen_001_Sample_010_010.fcs'
##  red+: 15195 of 57249 events (26.54%)
## 
## filter summary for frame 'Specimen_001_Sample_011_011.fcs'
##  red+: 12 of 57249 events (0.02%)
## 
## filter summary for frame 'Specimen_001_Sample_012_012.fcs'
##  red+: 3756 of 57249 events (6.56%)
## 
## filter summary for frame 'Specimen_001_Sample_013_013.fcs'
##  red+: 1296 of 57249 events (2.26%)
## 
## filter summary for frame 'Specimen_001_Sample_014_014.fcs'
##  red+: 475 of 57249 events (0.83%)
## 
## filter summary for frame 'Specimen_001_Sample_015_015.fcs'
##  red+: 73 of 57249 events (0.13%)
## 
## filter summary for frame 'Specimen_001_Sample_016_016.fcs'
##  red+: 0 of 57249 events (0.00%)
## 
## filter summary for frame 'Specimen_001_Sample_017_017.fcs'
##  red+: 3754 of 57249 events (6.56%)
## 
## filter summary for frame 'Specimen_001_Sample_018_018.fcs'
##  red+: 3 of 57249 events (0.01%)
## 
## filter summary for frame 'Specimen_001_Sample_019_019.fcs'
##  red+: 6 of 57249 events (0.01%)
## 
## filter summary for frame 'Specimen_001_Sample_020_020.fcs'
##  red+: 0 of 57249 events (0.00%)
## 
## filter summary for frame 'Specimen_001_Sample_021_021.fcs'
##  red+: 4 of 57249 events (0.01%)
## 
## filter summary for frame 'Specimen_001_Sample_022_022.fcs'
##  red+: 7880 of 57249 events (13.76%)
## 
## filter summary for frame 'Specimen_001_Sample_023_023.fcs'
##  red+: 354 of 57249 events (0.62%)
## 
## filter summary for frame 'Specimen_001_Sample_024_024.fcs'
##  red+: 45 of 57249 events (0.08%)
## 
## filter summary for frame 'Specimen_001_Sample_025_025.fcs'
##  red+: 3 of 57249 events (0.01%)
## 
## filter summary for frame 'Specimen_001_Sample_026_026.fcs'
##  red+: 30 of 57249 events (0.05%)
## 
## filter summary for frame 'Specimen_001_Sample_027_027.fcs'
##  red+: 3850 of 57249 events (6.73%)
## 
## filter summary for frame 'Specimen_001_Sample_028_028.fcs'
##  red+: 72 of 57249 events (0.13%)
## 
## filter summary for frame 'Specimen_001_Sample_029_029.fcs'
##  red+: 9 of 57249 events (0.02%)
## 
## filter summary for frame 'Specimen_001_Sample_030_030.fcs'
##  red+: 2 of 57249 events (0.00%)
## 
## filter summary for frame 'Specimen_001_Sample_031_031.fcs'
##  red+: 1 of 57249 events (0.00%)
## 
## filter summary for frame 'Specimen_001_Sample_032_032.fcs'
##  red+: 5309 of 57249 events (9.27%)
## 
## filter summary for frame 'Specimen_001_Sample_033_033.fcs'
##  red+: 9 of 57249 events (0.02%)
## 
## filter summary for frame 'Specimen_001_Sample_034_034.fcs'
##  red+: 3 of 57249 events (0.01%)
## 
## filter summary for frame 'Specimen_001_Sample_035_035.fcs'
##  red+: 24 of 57249 events (0.04%)
## 
## filter summary for frame 'Specimen_001_Sample_036_036.fcs'
##  red+: 0 of 57249 events (0.00%)
## 
## filter summary for frame 'Specimen_001_Sample_037_037.fcs'
##  red+: 10175 of 57249 events (17.77%)
## 
## filter summary for frame 'Specimen_001_Sample_038_038.fcs'
##  red+: 32 of 57249 events (0.06%)
## 
## filter summary for frame 'Specimen_001_Sample_039_039.fcs'
##  red+: 9 of 57249 events (0.02%)
## 
## filter summary for frame 'Specimen_001_Sample_040_040.fcs'
##  red+: 330 of 57249 events (0.58%)
## 
## filter summary for frame 'Specimen_001_Sample_041_041.fcs'
##  red+: 3 of 57249 events (0.01%)
## 
## filter summary for frame 'Specimen_001_Sample_042_042.fcs'
##  red+: 3885 of 57249 events (6.79%)
## 
## filter summary for frame 'Specimen_001_Sample_043_043.fcs'
##  red+: 15 of 57249 events (0.03%)
## 
## filter summary for frame 'Specimen_001_Sample_044_044.fcs'
##  red+: 48 of 57249 events (0.08%)
## 
## filter summary for frame 'Specimen_001_Sample_045_045.fcs'
##  red+: 2126 of 57249 events (3.71%)
## 
## filter summary for frame 'Specimen_001_Sample_046_046.fcs'
##  red+: 0 of 57249 events (0.00%)
## 
## filter summary for frame 'Specimen_001_Sample_047_047.fcs'
##  red+: 3478 of 57249 events (6.08%)
## 
## filter summary for frame 'Specimen_001_Sample_048_048.fcs'
##  red+: 3019 of 57249 events (5.27%)
## 
## filter summary for frame 'Specimen_001_Sample_049_049.fcs'
##  red+: 12573 of 57249 events (21.96%)
## 
## filter summary for frame 'Specimen_001_Sample_050_050.fcs'
##  red+: 1534 of 57249 events (2.68%)
## 
## filter summary for frame 'Specimen_001_Sample_051_051.fcs'
##  red+: 0 of 57249 events (0.00%)
## 
## filter summary for frame 'Specimen_001_Sample_052_052.fcs'
##  red+: 2069 of 57249 events (3.61%)
## 
## filter summary for frame 'Specimen_001_Sample_053_053.fcs'
##  red+: 9813 of 57249 events (17.14%)
## 
## filter summary for frame 'Specimen_001_Sample_054_054.fcs'
##  red+: 7481 of 57249 events (13.07%)
## 
## filter summary for frame 'Specimen_001_Sample_055_055.fcs'
##  red+: 6161 of 57249 events (10.76%)
## 
## filter summary for frame 'Specimen_001_Sample_056_056.fcs'
##  red+: 6 of 57249 events (0.01%)
## 
## filter summary for frame 'Specimen_001_Sample_057_057.fcs'
##  red+: 5148 of 57249 events (8.99%)
## 
## filter summary for frame 'Specimen_001_Sample_058_058.fcs'
##  red+: 13285 of 57249 events (23.21%)
## 
## filter summary for frame 'Specimen_001_Sample_059_059.fcs'
##  red+: 4427 of 57249 events (7.73%)
## 
## filter summary for frame 'Specimen_001_Sample_060_060.fcs'
##  red+: 15903 of 57249 events (27.78%)
## 
## filter summary for frame 'Specimen_001_Sample_061_061.fcs'
##  red+: 3 of 57249 events (0.01%)
## 
## filter summary for frame 'Specimen_001_Sample_062_062.fcs'
##  red+: 2630 of 57249 events (4.59%)
## 
## filter summary for frame 'Specimen_001_Sample_063_063.fcs'
##  red+: 7 of 57249 events (0.01%)
## 
## filter summary for frame 'Specimen_001_Sample_064_064.fcs'
##  red+: 1 of 57249 events (0.00%)
## 
## filter summary for frame 'Specimen_001_Sample_065_065.fcs'
##  red+: 19344 of 57249 events (33.79%)
## 
## filter summary for frame 'Specimen_001_Sample_066_066.fcs'
##  red+: 1 of 57249 events (0.00%)
## 
## filter summary for frame 'Specimen_001_Sample_067_067.fcs'
##  red+: 5255 of 57249 events (9.18%)
## 
## filter summary for frame 'Specimen_001_Sample_068_068.fcs'
##  red+: 8 of 57249 events (0.01%)
## 
## filter summary for frame 'Specimen_001_Sample_069_069.fcs'
##  red+: 6 of 57249 events (0.01%)
## 
## filter summary for frame 'Specimen_001_Sample_070_070.fcs'
##  red+: 13 of 57249 events (0.02%)
## 
## filter summary for frame 'Specimen_001_Sample_071_071.fcs'
##  red+: 5 of 57249 events (0.01%)
## 
## filter summary for frame 'Specimen_001_Sample_072_072.fcs'
##  red+: 3391 of 57249 events (5.92%)
## 
## filter summary for frame 'Specimen_001_Sample_073_073.fcs'
##  red+: 7233 of 57249 events (12.63%)
## 
## filter summary for frame 'Specimen_001_Sample_074_074.fcs'
##  red+: 5374 of 57249 events (9.39%)
## 
## filter summary for frame 'Specimen_001_Sample_075_075.fcs'
##  red+: 1185 of 57249 events (2.07%)
## 
## filter summary for frame 'Specimen_001_Sample_076_076.fcs'
##  red+: 16 of 57249 events (0.03%)
## 
## filter summary for frame 'Specimen_001_Sample_077_077.fcs'
##  red+: 2670 of 57249 events (4.66%)
## 
## filter summary for frame 'Specimen_001_Sample_078_078.fcs'
##  red+: 17948 of 57249 events (31.35%)
## 
## filter summary for frame 'Specimen_001_Sample_079_079.fcs'
##  red+: 16025 of 57249 events (27.99%)
## 
## filter summary for frame 'Specimen_001_Sample_080_080.fcs'
##  red+: 7483 of 57249 events (13.07%)
## 
## filter summary for frame 'Specimen_001_Sample_081_081.fcs'
##  red+: 0 of 57249 events (0.00%)
## 
## filter summary for frame 'Specimen_001_Sample_082_082.fcs'
##  red+: 2245 of 57249 events (3.92%)
## 
## filter summary for frame 'Specimen_001_Sample_083_083.fcs'
##  red+: 35828 of 57249 events (62.58%)
## 
## filter summary for frame 'Specimen_001_Sample_084_084.fcs'
##  red+: 16511 of 57249 events (28.84%)
## 
## filter summary for frame 'Specimen_001_Sample_085_085.fcs'
##  red+: 1269 of 57249 events (2.22%)
## 
## filter summary for frame 'Specimen_001_Sample_086_086.fcs'
##  red+: 2 of 57249 events (0.00%)
## 
## filter summary for frame 'Specimen_001_Sample_087_087.fcs'
##  red+: 4506 of 57249 events (7.87%)
## 
## filter summary for frame 'Specimen_001_Sample_088_088.fcs'
##  red+: 10493 of 57249 events (18.33%)
## 
## filter summary for frame 'Specimen_001_Sample_089_089.fcs'
##  red+: 14558 of 57249 events (25.43%)
## 
## filter summary for frame 'Specimen_001_Sample_090_090.fcs'
##  red+: 9613 of 57249 events (16.79%)
## 
## filter summary for frame 'Specimen_001_Sample_091_091.fcs'
##  red+: 1 of 57249 events (0.00%)
## 
## filter summary for frame 'Specimen_001_Sample_092_092.fcs'
##  red+: 2824 of 57249 events (4.93%)
## 
## filter summary for frame 'Specimen_001_Sample_093_093.fcs'
##  red+: 7238 of 57249 events (12.64%)
## 
## filter summary for frame 'Specimen_001_Sample_094_094.fcs'
##  red+: 11711 of 57249 events (20.46%)
## 
## filter summary for frame 'Specimen_001_Sample_095_095.fcs'
##  red+: 10861 of 57249 events (18.97%)
## 
## filter summary for frame 'Specimen_001_Sample_096_096.fcs'
##  red+: 1 of 57249 events (0.00%)
## 
## filter summary for frame 'Specimen_001_Sample_097_097.fcs'
##  red+: 2182 of 57249 events (3.81%)
## 
## filter summary for frame 'Specimen_001_Sample_098_098.fcs'
##  red+: 10292 of 57249 events (17.98%)
## 
## filter summary for frame 'Specimen_001_Sample_099_099.fcs'
##  red+: 24531 of 57249 events (42.85%)
## 
## filter summary for frame 'Specimen_001_Sample_100_100.fcs'
##  red+: 1618 of 57249 events (2.83%)
## Warning: Column `name` joining factor and character vector, coercing into
## character vector
percent_green = toTable(summary(result_green)) %>%
    mutate(x = 1e5, y =1.5e4, colour="green", order=phenoData(events)$order) %>%
    rename(name=sample) %>%
    left_join(metadata, by="name")
## filter summary for frame 'Specimen_001_Sample_001_001.fcs'
##  green+: 173 of 57249 events (0.30%)
## 
## filter summary for frame 'Specimen_001_Sample_002_002.fcs'
##  green+: 4446 of 57249 events (7.77%)
## 
## filter summary for frame 'Specimen_001_Sample_003_003.fcs'
##  green+: 9206 of 57249 events (16.08%)
## 
## filter summary for frame 'Specimen_001_Sample_004_004.fcs'
##  green+: 15338 of 57249 events (26.79%)
## 
## filter summary for frame 'Specimen_001_Sample_005_005.fcs'
##  green+: 6628 of 57249 events (11.58%)
## 
## filter summary for frame 'Specimen_001_Sample_006_006.fcs'
##  green+: 111 of 57249 events (0.19%)
## 
## filter summary for frame 'Specimen_001_Sample_007_007.fcs'
##  green+: 7126 of 57249 events (12.45%)
## 
## filter summary for frame 'Specimen_001_Sample_008_008.fcs'
##  green+: 5484 of 57249 events (9.58%)
## 
## filter summary for frame 'Specimen_001_Sample_009_009.fcs'
##  green+: 1104 of 57249 events (1.93%)
## 
## filter summary for frame 'Specimen_001_Sample_010_010.fcs'
##  green+: 13378 of 57249 events (23.37%)
## 
## filter summary for frame 'Specimen_001_Sample_011_011.fcs'
##  green+: 380 of 57249 events (0.66%)
## 
## filter summary for frame 'Specimen_001_Sample_012_012.fcs'
##  green+: 6285 of 57249 events (10.98%)
## 
## filter summary for frame 'Specimen_001_Sample_013_013.fcs'
##  green+: 9158 of 57249 events (16.00%)
## 
## filter summary for frame 'Specimen_001_Sample_014_014.fcs'
##  green+: 19600 of 57249 events (34.24%)
## 
## filter summary for frame 'Specimen_001_Sample_015_015.fcs'
##  green+: 7081 of 57249 events (12.37%)
## 
## filter summary for frame 'Specimen_001_Sample_016_016.fcs'
##  green+: 187 of 57249 events (0.33%)
## 
## filter summary for frame 'Specimen_001_Sample_017_017.fcs'
##  green+: 9642 of 57249 events (16.84%)
## 
## filter summary for frame 'Specimen_001_Sample_018_018.fcs'
##  green+: 20680 of 57249 events (36.12%)
## 
## filter summary for frame 'Specimen_001_Sample_019_019.fcs'
##  green+: 12307 of 57249 events (21.50%)
## 
## filter summary for frame 'Specimen_001_Sample_020_020.fcs'
##  green+: 8283 of 57249 events (14.47%)
## 
## filter summary for frame 'Specimen_001_Sample_021_021.fcs'
##  green+: 159 of 57249 events (0.28%)
## 
## filter summary for frame 'Specimen_001_Sample_022_022.fcs'
##  green+: 19529 of 57249 events (34.11%)
## 
## filter summary for frame 'Specimen_001_Sample_023_023.fcs'
##  green+: 12246 of 57249 events (21.39%)
## 
## filter summary for frame 'Specimen_001_Sample_024_024.fcs'
##  green+: 19073 of 57249 events (33.32%)
## 
## filter summary for frame 'Specimen_001_Sample_025_025.fcs'
##  green+: 18768 of 57249 events (32.78%)
## 
## filter summary for frame 'Specimen_001_Sample_026_026.fcs'
##  green+: 563 of 57249 events (0.98%)
## 
## filter summary for frame 'Specimen_001_Sample_027_027.fcs'
##  green+: 5206 of 57249 events (9.09%)
## 
## filter summary for frame 'Specimen_001_Sample_028_028.fcs'
##  green+: 7846 of 57249 events (13.71%)
## 
## filter summary for frame 'Specimen_001_Sample_029_029.fcs'
##  green+: 9025 of 57249 events (15.76%)
## 
## filter summary for frame 'Specimen_001_Sample_030_030.fcs'
##  green+: 22024 of 57249 events (38.47%)
## 
## filter summary for frame 'Specimen_001_Sample_031_031.fcs'
##  green+: 73 of 57249 events (0.13%)
## 
## filter summary for frame 'Specimen_001_Sample_032_032.fcs'
##  green+: 6318 of 57249 events (11.04%)
## 
## filter summary for frame 'Specimen_001_Sample_033_033.fcs'
##  green+: 424 of 57249 events (0.74%)
## 
## filter summary for frame 'Specimen_001_Sample_034_034.fcs'
##  green+: 9791 of 57249 events (17.10%)
## 
## filter summary for frame 'Specimen_001_Sample_035_035.fcs'
##  green+: 18072 of 57249 events (31.57%)
## 
## filter summary for frame 'Specimen_001_Sample_036_036.fcs'
##  green+: 34 of 57249 events (0.06%)
## 
## filter summary for frame 'Specimen_001_Sample_037_037.fcs'
##  green+: 15957 of 57249 events (27.87%)
## 
## filter summary for frame 'Specimen_001_Sample_038_038.fcs'
##  green+: 425 of 57249 events (0.74%)
## 
## filter summary for frame 'Specimen_001_Sample_039_039.fcs'
##  green+: 298 of 57249 events (0.52%)
## 
## filter summary for frame 'Specimen_001_Sample_040_040.fcs'
##  green+: 1571 of 57249 events (2.74%)
## 
## filter summary for frame 'Specimen_001_Sample_041_041.fcs'
##  green+: 239 of 57249 events (0.42%)
## 
## filter summary for frame 'Specimen_001_Sample_042_042.fcs'
##  green+: 6408 of 57249 events (11.19%)
## 
## filter summary for frame 'Specimen_001_Sample_043_043.fcs'
##  green+: 322 of 57249 events (0.56%)
## 
## filter summary for frame 'Specimen_001_Sample_044_044.fcs'
##  green+: 236 of 57249 events (0.41%)
## 
## filter summary for frame 'Specimen_001_Sample_045_045.fcs'
##  green+: 6213 of 57249 events (10.85%)
## 
## filter summary for frame 'Specimen_001_Sample_046_046.fcs'
##  green+: 107 of 57249 events (0.19%)
## 
## filter summary for frame 'Specimen_001_Sample_047_047.fcs'
##  green+: 6658 of 57249 events (11.63%)
## 
## filter summary for frame 'Specimen_001_Sample_048_048.fcs'
##  green+: 12717 of 57249 events (22.21%)
## 
## filter summary for frame 'Specimen_001_Sample_049_049.fcs'
##  green+: 11234 of 57249 events (19.62%)
## 
## filter summary for frame 'Specimen_001_Sample_050_050.fcs'
##  green+: 338 of 57249 events (0.59%)
## 
## filter summary for frame 'Specimen_001_Sample_051_051.fcs'
##  green+: 75 of 57249 events (0.13%)
## 
## filter summary for frame 'Specimen_001_Sample_052_052.fcs'
##  green+: 3687 of 57249 events (6.44%)
## 
## filter summary for frame 'Specimen_001_Sample_053_053.fcs'
##  green+: 756 of 57249 events (1.32%)
## 
## filter summary for frame 'Specimen_001_Sample_054_054.fcs'
##  green+: 2685 of 57249 events (4.69%)
## 
## filter summary for frame 'Specimen_001_Sample_055_055.fcs'
##  green+: 458 of 57249 events (0.80%)
## 
## filter summary for frame 'Specimen_001_Sample_056_056.fcs'
##  green+: 399 of 57249 events (0.70%)
## 
## filter summary for frame 'Specimen_001_Sample_057_057.fcs'
##  green+: 12604 of 57249 events (22.02%)
## 
## filter summary for frame 'Specimen_001_Sample_058_058.fcs'
##  green+: 452 of 57249 events (0.79%)
## 
## filter summary for frame 'Specimen_001_Sample_059_059.fcs'
##  green+: 4143 of 57249 events (7.24%)
## 
## filter summary for frame 'Specimen_001_Sample_060_060.fcs'
##  green+: 469 of 57249 events (0.82%)
## 
## filter summary for frame 'Specimen_001_Sample_061_061.fcs'
##  green+: 272 of 57249 events (0.48%)
## 
## filter summary for frame 'Specimen_001_Sample_062_062.fcs'
##  green+: 4934 of 57249 events (8.62%)
## 
## filter summary for frame 'Specimen_001_Sample_063_063.fcs'
##  green+: 383 of 57249 events (0.67%)
## 
## filter summary for frame 'Specimen_001_Sample_064_064.fcs'
##  green+: 153 of 57249 events (0.27%)
## 
## filter summary for frame 'Specimen_001_Sample_065_065.fcs'
##  green+: 1051 of 57249 events (1.84%)
## 
## filter summary for frame 'Specimen_001_Sample_066_066.fcs'
##  green+: 95 of 57249 events (0.17%)
## 
## filter summary for frame 'Specimen_001_Sample_067_067.fcs'
##  green+: 9398 of 57249 events (16.42%)
## 
## filter summary for frame 'Specimen_001_Sample_068_068.fcs'
##  green+: 464 of 57249 events (0.81%)
## 
## filter summary for frame 'Specimen_001_Sample_069_069.fcs'
##  green+: 168 of 57249 events (0.29%)
## 
## filter summary for frame 'Specimen_001_Sample_070_070.fcs'
##  green+: 447 of 57249 events (0.78%)
## 
## filter summary for frame 'Specimen_001_Sample_071_071.fcs'
##  green+: 180 of 57249 events (0.31%)
## 
## filter summary for frame 'Specimen_001_Sample_072_072.fcs'
##  green+: 6585 of 57249 events (11.50%)
## 
## filter summary for frame 'Specimen_001_Sample_073_073.fcs'
##  green+: 611 of 57249 events (1.07%)
## 
## filter summary for frame 'Specimen_001_Sample_074_074.fcs'
##  green+: 355 of 57249 events (0.62%)
## 
## filter summary for frame 'Specimen_001_Sample_075_075.fcs'
##  green+: 31 of 57249 events (0.05%)
## 
## filter summary for frame 'Specimen_001_Sample_076_076.fcs'
##  green+: 451 of 57249 events (0.79%)
## 
## filter summary for frame 'Specimen_001_Sample_077_077.fcs'
##  green+: 4719 of 57249 events (8.24%)
## 
## filter summary for frame 'Specimen_001_Sample_078_078.fcs'
##  green+: 169 of 57249 events (0.30%)
## 
## filter summary for frame 'Specimen_001_Sample_079_079.fcs'
##  green+: 458 of 57249 events (0.80%)
## 
## filter summary for frame 'Specimen_001_Sample_080_080.fcs'
##  green+: 112 of 57249 events (0.20%)
## 
## filter summary for frame 'Specimen_001_Sample_081_081.fcs'
##  green+: 58 of 57249 events (0.10%)
## 
## filter summary for frame 'Specimen_001_Sample_082_082.fcs'
##  green+: 3967 of 57249 events (6.93%)
## 
## filter summary for frame 'Specimen_001_Sample_083_083.fcs'
##  green+: 34 of 57249 events (0.06%)
## 
## filter summary for frame 'Specimen_001_Sample_084_084.fcs'
##  green+: 186 of 57249 events (0.32%)
## 
## filter summary for frame 'Specimen_001_Sample_085_085.fcs'
##  green+: 302 of 57249 events (0.53%)
## 
## filter summary for frame 'Specimen_001_Sample_086_086.fcs'
##  green+: 85 of 57249 events (0.15%)
## 
## filter summary for frame 'Specimen_001_Sample_087_087.fcs'
##  green+: 7965 of 57249 events (13.91%)
## 
## filter summary for frame 'Specimen_001_Sample_088_088.fcs'
##  green+: 67 of 57249 events (0.12%)
## 
## filter summary for frame 'Specimen_001_Sample_089_089.fcs'
##  green+: 173 of 57249 events (0.30%)
## 
## filter summary for frame 'Specimen_001_Sample_090_090.fcs'
##  green+: 189 of 57249 events (0.33%)
## 
## filter summary for frame 'Specimen_001_Sample_091_091.fcs'
##  green+: 54 of 57249 events (0.09%)
## 
## filter summary for frame 'Specimen_001_Sample_092_092.fcs'
##  green+: 16862 of 57249 events (29.45%)
## 
## filter summary for frame 'Specimen_001_Sample_093_093.fcs'
##  green+: 292 of 57249 events (0.51%)
## 
## filter summary for frame 'Specimen_001_Sample_094_094.fcs'
##  green+: 1364 of 57249 events (2.38%)
## 
## filter summary for frame 'Specimen_001_Sample_095_095.fcs'
##  green+: 3494 of 57249 events (6.10%)
## 
## filter summary for frame 'Specimen_001_Sample_096_096.fcs'
##  green+: 148 of 57249 events (0.26%)
## 
## filter summary for frame 'Specimen_001_Sample_097_097.fcs'
##  green+: 5392 of 57249 events (9.42%)
## 
## filter summary for frame 'Specimen_001_Sample_098_098.fcs'
##  green+: 146 of 57249 events (0.26%)
## 
## filter summary for frame 'Specimen_001_Sample_099_099.fcs'
##  green+: 175 of 57249 events (0.31%)
## 
## filter summary for frame 'Specimen_001_Sample_100_100.fcs'
##  green+: 68 of 57249 events (0.12%)
## Warning: Column `name` joining factor and character vector, coercing into
## character vector
percentage = bind_rows(percent_red, percent_green) %>%
    group_by(name) %>% 
    mutate(total_gfp_mcherry = sum(true)) %>%
    mutate(fraction_fluor = round(true/total_gfp_mcherry, 3)) %>%
    mutate(percent_fluor = fraction_fluor*100) %>%
    mutate(label = paste(true, "events"))
## Warning in bind_rows_(x, .id): Unequal factor levels: coercing to character
## Warning in bind_rows_(x, .id): binding character and factor vector, coercing
## into character vector

## Warning in bind_rows_(x, .id): binding character and factor vector, coercing
## into character vector
ggplot() + 
    geom_point(data=events, aes(x=`530/30 Blue B-A`, y=`610/20 YG C-A`), shape=16, size=0.5, alpha=0.2, colour="black") +
    geom_point(data=events_green, aes(x=`530/30 Blue B-A`, y=`610/20 YG C-A`), shape=16, size=0.5, alpha=0.2, colour="green4") +
    geom_point(data=events_red, aes(x=`530/30 Blue B-A`, y=`610/20 YG C-A`), shape=16, size=0.5, alpha=0.2, colour="red3") +
    geom_text(data=percentage, aes(x=x, y=y, label=label, colour=colour), size=3, hjust=1) +
    geom_text(data=percentage, aes(x=1e5, y=9e4, label=paste0(count, " events total")), colour="grey27", size=3, hjust=1) +
    scale_colour_manual(values=c("green4", "red3")) +
    scale_y_logicle(name="mCherry intensity",  t=10000, m=3, w=1, breaks=c(0, 1e3,1e4,1e5), limits=c(-1e3, 4e5)) +
    scale_x_logicle(name="GFP intensity",  t=10000, m=3, w=1, breaks=c(0, 1e3,1e4,1e5), limits=c(-1e3, 1.5e5)) +
    theme_linedraw(12) +
    theme(panel.grid = element_blank(), 
          axis.title.x = element_text(colour="green4"), 
          axis.title.y = element_text(colour="red3"), 
          legend.position = "none") +
    facet_grid(Mouse~Timepoint) 
## Warning: Removed 53 rows containing missing values (geom_point).

ggsave("figures/exp17_GFP_mCherry_scatterplot.png", width=12, height=40, dpi=150)
## Warning: Removed 53 rows containing missing values (geom_point).


Make scatterplots split on NT and GFPT

samples = metadata %>%
    dplyr::filter(Treatment == "NT") %>%
    pull(FlowSampleNumber)

percentage_samples = percentage %>%
    dplyr::filter(FlowSampleNumber %in% samples)

ggplot() + 
    geom_point(data=events[samples], aes(x=`530/30 Blue B-A`, y=`610/20 YG C-A`), shape=16, size=0.5, alpha=0.2, colour="black") +
    geom_point(data=events_green[samples], aes(x=`530/30 Blue B-A`, y=`610/20 YG C-A`), shape=16, size=0.5, alpha=0.2, colour="green4") +
    geom_point(data=events_red[samples], aes(x=`530/30 Blue B-A`, y=`610/20 YG C-A`), shape=16, size=0.5, alpha=0.2, colour="red3") +
    geom_text(data=percentage_samples, aes(x=x, y=y, label=label, colour=colour), size=3, hjust=1) +
    geom_text(data=percentage_samples, aes(x=1e5, y=9e4, label=paste0(count, " events total")), colour="grey27", size=3, hjust=1) +
    scale_colour_manual(values=c("green4", "red3")) +
    scale_y_logicle(name="mCherry intensity",  t=10000, m=3, w=1, breaks=c(0, 1e3,1e4,1e5), limits=c(-1e3, 4e5)) +
    scale_x_logicle(name="GFP intensity",  t=10000, m=3, w=1, breaks=c(0, 1e3,1e4,1e5), limits=c(-1e3, 1.5e5)) +
    theme_linedraw(12) +
    theme(panel.grid = element_blank(), 
          axis.title.x = element_text(colour="green4"), 
          axis.title.y = element_text(colour="red3"), 
          legend.position = "none") +
    facet_grid(Mouse_Treatment~Day) 
## Warning: Removed 46 rows containing missing values (geom_point).

ggsave("figures/exp17_GFP_mCherry_scatterplot_NT.png", width=12, height=20, dpi=150)
## Warning: Removed 46 rows containing missing values (geom_point).
samples = metadata %>%
    filter(Treatment == "GFPT") %>%
    pull(FlowSampleNumber)

percentage_samples = percentage %>%
    filter(FlowSampleNumber %in% samples)

ggplot() + 
    geom_point(data=events[samples], aes(x=`530/30 Blue B-A`, y=`610/20 YG C-A`), shape=16, size=0.5, alpha=0.2, colour="black") +
    geom_point(data=events_green[samples], aes(x=`530/30 Blue B-A`, y=`610/20 YG C-A`), shape=16, size=0.5, alpha=0.2, colour="green4") +
    geom_point(data=events_red[samples], aes(x=`530/30 Blue B-A`, y=`610/20 YG C-A`), shape=16, size=0.5, alpha=0.2, colour="red3") +
    geom_text(data=percentage_samples, aes(x=x, y=y, label=label, colour=colour), size=3, hjust=1) +
    geom_text(data=percentage_samples, aes(x=1e5, y=9e4, label=paste0(count, " events total")), colour="grey27", size=3, hjust=1) +
    scale_colour_manual(values=c("green4", "red3")) +
    scale_y_logicle(name="mCherry intensity",  t=10000, m=3, w=1, breaks=c(0, 1e3,1e4,1e5), limits=c(-1e3, 4e5)) +
    scale_x_logicle(name="GFP intensity",  t=10000, m=3, w=1, breaks=c(0, 1e3,1e4,1e5), limits=c(-1e3, 1.5e5)) +
    theme_linedraw(12) +
    theme(panel.grid = element_blank(), 
          axis.title.x = element_text(colour="green4"), 
          axis.title.y = element_text(colour="red3"), 
          legend.position = "none") +
    facet_grid(Mouse_Treatment~Day) 
## Warning: Removed 7 rows containing missing values (geom_point).

ggsave("figures/exp17_GFP_mCherry_scatterplot_GFPT.png", width=12, height=20, dpi=150)
## Warning: Removed 7 rows containing missing values (geom_point).


Make figure of scatterplot for select NT/GFPT mice only

subset = c("Mouse 2", "Mouse 15")

samples = metadata %>% 
    filter(Mouse %in% subset) %>%
    pull(FlowSampleNumber)

percentage_samples = percentage %>% 
    filter(Mouse %in% subset)

ggplot() + 
    geom_point(data=events[samples], aes(x=`530/30 Blue B-A`, y=`610/20 YG C-A`), shape=16, size=0.5, alpha=0.2, colour="black") +
    geom_point(data=events_green[samples], aes(x=`530/30 Blue B-A`, y=`610/20 YG C-A`), shape=16, size=0.5, alpha=0.2, colour="green4") +
    geom_point(data=events_red[samples], aes(x=`530/30 Blue B-A`, y=`610/20 YG C-A`), shape=16, size=0.5, alpha=0.2, colour="red3") +
    geom_text(data=percentage_samples, aes(x=x, y=y, label=label, colour=colour), size=3, hjust=1) +
    geom_text(data=percentage_samples, aes(x=1e5, y=1.5e5, label=paste0(count, " events total")), colour="grey27", size=3, hjust=1) +
    scale_colour_manual(values=c("green4", "red3")) +
    scale_y_logicle(name="mCherry intensity",  t=10000, m=3, w=1, breaks=c(0, 1e3,1e4,1e5), limits=c(-1e3, 4e5)) +
    scale_x_logicle(name="GFP intensity",  t=10000, m=3, w=1, breaks=c(0, 1e3,1e4,1e5), limits=c(-1e3, 1.5e5)) +
    theme_linedraw(14) +
    theme(panel.grid = element_blank(), 
          panel.border = element_rect(size=1.25),
          axis.title.x = element_text(colour="green4"), 
          axis.title.y = element_text(colour="red3"), 
          legend.position = "none") +
    facet_grid(Treatment_Mouse~Day) 
## Warning: Removed 5 rows containing missing values (geom_point).

ggsave("figures/exp17_GFP_mCherry_scatterplot_M2_M15.png", width=12, height=5, dpi=150)
## Warning: Removed 5 rows containing missing values (geom_point).


Calculate background green and red at pre-E. coli timepoint

bg_green_high = percentage %>%
    dplyr::filter(population == "green+", Timepoint == -3) %>%
    pull(true) %>%
    max()

bg_red_high = percentage %>%
    dplyr::filter(population == "red+", Timepoint == -3) %>%
    pull(true) %>%
    max()

#set background for both green/red based on each mouse
percentage = percentage %>%
    group_by(Mouse, population) %>%
    mutate(bg = true[which(Timepoint == -3)]) %>%
    ungroup() %>%
    mutate(positive_events_minusbg = true - bg)

#set all negative values or 0 values to one
percentage = percentage %>%
    mutate(positive_events_minusbg_nozeros = as.double(positive_events_minusbg)) %>%
    mutate(positive_events_minusbg_nozeros = case_when(positive_events_minusbg_nozeros <= 0 ~ 1, 
                                               positive_events_minusbg_nozeros > 0 ~ positive_events_minusbg_nozeros))


Look at number of GFP+ and RFP+ events over time for all mice

ggplot(percentage) +
    annotate("rect", xmin=0.25, xmax=7.25, ymin=0, ymax=Inf, fill="honeydew2", colour=NA, alpha=0.75) +
    geom_line(aes(x=Timepoint, y=positive_events_minusbg_nozeros, colour=population, group=interaction(Mouse, population)), size=1) +
    geom_point(aes(x=Timepoint, y=positive_events_minusbg_nozeros, colour=population), size=2, alpha=1) +
    scale_y_log10(name="Positive events \n(background subtracted)\n", labels = trans_format("log10", math_format(10^.x))) + 
    scale_x_continuous(name="Day", breaks=seq(-4,15,2)) +
    scale_colour_manual(values=c("green4", "red3")) +
    theme_linedraw(12) +
    theme(panel.grid = element_blank(), panel.grid.major.y = element_blank(), panel.border=element_rect(size=1.5), legend.position = "top") +
    annotation_logticks(sides="l") +
    facet_wrap(~Mouse)
## Warning: Transformation introduced infinite values in continuous y-axis

ggsave("figures/exp17_timecourse_green_red_byMouse_unfiltered.png",  height=8, width=12, dpi=150)
## Warning: Transformation introduced infinite values in continuous y-axis
#filter out timepoints where red AND green are both below the highest background observed for each pre-col 
percentage_filtered = percentage %>%
    mutate(bg_high = case_when(population == "green+" ~ bg_green_high, population == "red+" ~ bg_red_high)) %>%  #background depending on fluor
    mutate(below_background = ifelse(true > bg_high * 3, "no", "yes")) %>%                                           #mark whether above or below background
    mutate(Mouse_Timepoint = paste(Mouse, Timepoint))

#make new table of mouse+timepoint to filter by 
filter_below = percentage_filtered %>%
    dplyr::select(Mouse, Timepoint, Mouse_Timepoint, population, bg, below_background) %>%
    dplyr::filter(below_background == "yes") %>% 
    dplyr::filter(Timepoint != -3) %>%
    pivot_wider(names_from=population, values_from=bg) %>%
    dplyr::filter(is.na(`green+`) == FALSE & is.na(`red+`) == FALSE)

`%notin%` <- Negate(`%in%`)

percentage_filtered = percentage_filtered %>%
    dplyr::filter(Mouse_Timepoint %notin% filter_below$Mouse_Timepoint)
ggplot(percentage_filtered) +
    annotate("rect", xmin=0.25, xmax=7.25, ymin=0, ymax=Inf, fill="honeydew2", colour=NA, alpha=0.75) +
    geom_point(aes(x=Timepoint, y=positive_events_minusbg_nozeros, colour=population), size=2, alpha=1) +
    geom_line(aes(x=Timepoint, y=positive_events_minusbg_nozeros, colour=population, group=interaction(Mouse, population)), size=1) +
    scale_y_log10(name="Positive events \n(background subtracted)\n", labels = trans_format("log10", math_format(10^.x))) + 
    scale_x_continuous(name="Day", breaks=seq(-4,15,2)) +
    scale_colour_manual(values=c("green4", "red3")) +
    theme_linedraw(12) +
    theme(panel.grid = element_blank(), panel.grid.major.y = element_blank(), panel.border=element_rect(size=1.5), legend.position = "top") +
    annotation_logticks(sides="l") +
    facet_wrap(~Mouse)
## Warning: Transformation introduced infinite values in continuous y-axis

ggsave("figures/exp17_timecourse_green_red_byMouse.png", height=8, width=12, dpi=150)
## Warning: Transformation introduced infinite values in continuous y-axis
ggsave("figures/exp17_timecourse_green_red_byMouse.pdf", height=8, width=12)
## Warning: Transformation introduced infinite values in continuous y-axis


Try faceting by population

percentage_filtered_green = percentage_filtered %>%
    dplyr::filter(population == "green+")

percentage_filtered_red = percentage_filtered %>%
    dplyr::filter(population == "red+")
green = ggplot(percentage_filtered_green) +
    annotate("rect", xmin=0.75, xmax=7.75, ymin=0, ymax=Inf, fill="honeydew2", colour=NA, alpha=0.75) +
    geom_jitter(aes(x=Timepoint, y=positive_events_minusbg_nozeros, colour=Treatment), position=position_jitterdodge(dodge.width=1), size=2.5, alpha=0.35) +
    stat_summary(aes(x=Timepoint, y=positive_events_minusbg_nozeros, group=factor(interaction(Treatment, Timepoint)), colour=Treatment), size=0.75, alpha=1, 
                 geom="pointrange", position=position_dodge(width=1), fun.y = mean, fun.ymin = min, fun.ymax = max) +
    stat_summary(aes(x=Timepoint, y=positive_events_minusbg_nozeros, group=Treatment, colour=Treatment), size=0.75, alpha=0.75, 
                 geom="line", position=position_dodge(width=1), fun.y = mean) +
    scale_y_log10(name="GFP+ events\n(background subtracted)", labels = trans_format("log10", math_format(10^.x))) + 
    scale_x_continuous(name="Day", breaks=seq(-4,15,2)) +
    scale_colour_manual(values=c("black", "green4")) +
    theme_linedraw(15) +
    theme(panel.grid.minor = element_blank(), panel.grid.major = element_blank(), panel.border=element_rect(size=1.5), legend.position = "top",  
          axis.title.y = element_text(colour="green4"), plot.margin = unit(c(10, 30, 10, 10),"pt")) +
    annotation_logticks(sides="l")

red = ggplot(percentage_filtered_red) +
    annotate("rect", xmin=0.75, xmax=7.75, ymin=0, ymax=Inf, fill="honeydew2", colour=NA, alpha=0.75) +
    geom_jitter(aes(x=Timepoint, y=positive_events_minusbg_nozeros, colour=Treatment), position=position_jitterdodge(dodge.width=1), size=2.5, alpha=0.35) +
    stat_summary(aes(x=Timepoint, y=positive_events_minusbg_nozeros, group=factor(interaction(population, Treatment, Timepoint)), colour=Treatment), size=0.75, alpha=1, 
                 geom="pointrange", position=position_dodge(width=1), fun.y = mean, fun.ymin = min, fun.ymax = max) +
    stat_summary(aes(x=Timepoint, y=positive_events_minusbg_nozeros, group=Treatment, colour=Treatment), size=0.75, alpha=0.75, 
                 geom="line", position=position_dodge(width=1), fun.y = mean) +
    scale_y_log10(name="RFP+ events\n(background subtracted)", labels = trans_format("log10", math_format(10^.x))) + 
    scale_x_continuous(name="Day", breaks=seq(-4,15,2)) +
    scale_colour_manual(values=c("black", "green4")) +
    theme_linedraw(15) +
    theme(panel.grid.minor = element_blank(), panel.grid.major = element_blank(), panel.border=element_rect(size=1.5), legend.position = "top", 
          axis.title.y = element_text(colour="red3")) +
    annotation_logticks(sides="l")

plot_grid(green, red)
## Warning: Transformation introduced infinite values in continuous y-axis

## Warning: Transformation introduced infinite values in continuous y-axis

ggsave("figures/exp17_timecourse_byPopulation_pointrange.png", width=12, height=6, dpi=150)


Try faceting by treatment (green and red on same plot)

percentage_filtered = percentage_filtered %>%
    mutate(Treatment_Full = gsub("NT", "Non-Targeting", Treatment)) %>%
    mutate(Treatment_Full = gsub("GFPT", "GFP-Targeting", Treatment_Full)) %>%
    mutate(Treatment_Full = factor(Treatment_Full, levels=c("Non-Targeting", "GFP-Targeting")))

set.seed(111)

ggplot(percentage_filtered) +
    annotate("rect", xmin=0.75, xmax=7.75, ymin=0, ymax=Inf, fill="honeydew2", colour=NA, alpha=0.75) +
    geom_jitter(aes(x=Timepoint, y=positive_events_minusbg_nozeros, colour=population), position=position_jitterdodge(dodge.width=1.1), size=2, alpha=0.5) +
    stat_summary(aes(x=Timepoint, y=positive_events_minusbg_nozeros, group=population, colour=population), size=0.75, alpha=1, 
                 geom="line", position=position_dodge(width=0.5), fun.y = mean) +
    stat_summary(aes(x=Timepoint, y=positive_events_minusbg_nozeros, group=factor(interaction(population, Timepoint)), colour=population), size=0.75, alpha=1, 
                 geom="pointrange", position=position_dodge(width=1), fun.y = mean, fun.ymin = min, fun.ymax = max) +
    scale_y_log10(name="Positive events\n(background subtracted)", limits=c(1,40000)) + 
    scale_x_continuous(name="Day", breaks=seq(-4,15,2)) +
    scale_colour_manual(values=c("green4", "red3"), labels=c("GFP+", "mCherry+")) +
    theme_linedraw(14) +
    theme(panel.grid = element_blank(), panel.grid.major.y = element_blank(), panel.border=element_rect(size=1.5), legend.position = "top") +
    annotation_logticks(sides="l") +
    facet_wrap(~Treatment_Full, scales="free_y")
## Warning: Transformation introduced infinite values in continuous y-axis

ggsave("figures/exp17_timecourse_green_red_byTreatment_pointrange.png", width=12, height=6, dpi=150)
## Warning: Transformation introduced infinite values in continuous y-axis
ggsave("figures/exp17_timecourse_green_red_byTreatment_pointrange.pdf", width=12, height=6)
## Warning: Transformation introduced infinite values in continuous y-axis


Plot percent red/green at Day 14

dayfourteen = percentage_filtered %>%
    dplyr::filter(Timepoint == 14) 
#calculate percent positive green/red using background subtracted-positive events (no negatives)
dayfourteen = dayfourteen %>%
    mutate(positive_events_minusbg_nonegs = as.double(positive_events_minusbg)) %>%
    mutate(positive_events_minusbg_nonegs = case_when(positive_events_minusbg_nonegs <= 0 ~ 0, 
                                                      positive_events_minusbg_nonegs > 0 ~ positive_events_minusbg_nonegs)) %>%
    group_by(Mouse, Timepoint) %>%
    mutate(positive_events_minusbg_nonegs_gfp_mcherry_total = sum(positive_events_minusbg_nonegs)) %>%
    mutate(positive_events_minusbg_nonegs_percent_fluor = positive_events_minusbg_nonegs / positive_events_minusbg_nonegs_gfp_mcherry_total * 100) %>%
    ungroup()
#order mice by green fluor
green_ranked = dayfourteen %>%
    dplyr::filter(population=="green+") %>%
    arrange(Treatment, positive_events_minusbg_nonegs_percent_fluor) %>%
    pull(Mouse)

dayfourteen = dayfourteen %>% 
    mutate(Mouse = factor(Mouse, levels=rev(green_ranked))) %>%
    mutate(population = factor(population, levels=c("red+", "green+")))

#make df of labels to plot percentage red value on bar plot
labels = dayfourteen %>%
    dplyr::filter(population == "green+") %>%
    mutate(labels = paste0(round(positive_events_minusbg_nonegs_percent_fluor, 0), "%")) 
ggplot() +
     geom_bar(data=dayfourteen, aes(x=Mouse, y=positive_events_minusbg_nonegs_percent_fluor, fill=population), stat = "identity") +
     geom_text(data=labels, aes(x=Mouse, y=case_when(positive_events_minusbg_nonegs_percent_fluor > 10 ~ positive_events_minusbg_nonegs_percent_fluor - 4, 
                                                     positive_events_minusbg_nonegs_percent_fluor < 10 ~ positive_events_minusbg_nonegs_percent_fluor + 3),
                                label=labels), colour="white", size=3.5) +
     scale_fill_manual(values = c("red3", "green4"), labels=c("mCherry+", "GFP+")) +
     scale_y_continuous(name="Day 14  Percent GFP+ and mCherry+ events \n(background subtracted)", expand = c(0, 0), position="right", breaks=c(0,25,50,75,100), labels=c(0,25,50,75,100)) +
     scale_x_discrete(name = "", position = "top") +
     coord_flip() +
     theme_linedraw(14) +
     theme(legend.position = "bottom", legend.title=element_blank(), panel.grid=element_blank(),
           plot.margin=unit(c(5, 5, 5, 15),"mm"), 
           panel.border = element_rect(size=1.25)) +
     guides(fill = guide_legend(nrow = 1))

ggsave("figures/exp17_percent_green_red_barplot.pdf", height=6, width=7)


Calculate statistical significance of mean difference at Day 14

dayfourteen_green = dayfourteen %>%
    dplyr::filter(population=="green+") %>%
    mutate(Treatment = factor(Treatment, levels=c("NT", "GFPT")))

nt = dayfourteen_green %>% 
    dplyr::filter(Treatment=="NT") %>%
    pull(positive_events_minusbg_nonegs_percent_fluor)

gfpt = dayfourteen_green %>% 
    dplyr::filter(Treatment=="GFPT") %>%
    pull(positive_events_minusbg_nonegs_percent_fluor)

(mean_nt = round(mean(nt), 0))
## [1] 81
(mean_gfpt = round(mean(gfpt), 0))
## [1] 6
(median_nt = round(median(nt), 0))
## [1] 99
(median_gfpt = round(median(gfpt), 0))
## [1] 1
#try one-sided t-test for normal distributions
(test = t.test(gfpt, nt, alternative="less"))
## 
##  Welch Two Sample t-test
## 
## data:  gfpt and nt
## t = -7.7054, df = 10.664, p-value = 5.601e-06
## alternative hypothesis: true difference in means is less than 0
## 95 percent confidence interval:
##       -Inf -57.95704
## sample estimates:
## mean of x mean of y 
##  5.712913 81.349480
#do mann whitney wilcoxon test for nonparametric distribution
(test = wilcox.test(gfpt, nt, alternative = "less"))
## Warning in wilcox.test.default(gfpt, nt, alternative = "less"): cannot compute
## exact p-value with ties
## 
##  Wilcoxon rank sum test with continuity correction
## 
## data:  gfpt and nt
## W = 2, p-value = 0.0002485
## alternative hypothesis: true location shift is less than 0
pvalue = formatC(test$p.value, format = "e", digits = 2) 
set.seed(111)

ggplot(dayfourteen_green, aes(x=Treatment, y=percent_fluor, fill=population)) +
    geom_bar(stat="summary", fun.y = median, colour="black", size=0.75, width=0.5) + 
    geom_jitter(width=0.2, height=0.2, shape=21, colour="black", fill="white", size=4, stroke=1) +
    scale_fill_manual(values=c("green4")) +
    scale_x_discrete(name="") +
    scale_y_continuous(name="Day 14  Percent GFP+ events \n(background subtracted)", expand=c(0,0), limits=c(0, 120), breaks=seq(0,100,20)) +
    annotate("text", x=1.5, y=114, label=paste("p =", pvalue), size=4) +
    annotate("text", x=1.025, y=median_nt+6, label=paste0("median ", median_nt,"%"), size=4, colour="green4") +
    annotate("text", x=2.025, y=median_gfpt+11, label=paste0("median ", median_gfpt,"%"), size=4, colour="green4") +
    geom_segment(x=1, xend=2, y=110, yend=110) +
    theme_linedraw(15) +
    theme(panel.border = element_rect(size=1.5), panel.grid = element_blank(), legend.position="none",
          axis.text.x = element_text(size=16), axis.ticks.x = element_blank())

ggsave("figures/exp17_Day14_green_barplot_pvalue.pdf", height=6, width=4)


Record session

print(sessionInfo())
## R version 3.6.2 (2019-12-12)
## Platform: x86_64-pc-linux-gnu (64-bit)
## Running under: Ubuntu 19.10
## 
## Matrix products: default
## BLAS:   /usr/lib/x86_64-linux-gnu/blas/libblas.so.3.8.0
## LAPACK: /usr/lib/x86_64-linux-gnu/lapack/liblapack.so.3.8.0
## 
## locale:
##  [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C              
##  [3] LC_TIME=en_US.UTF-8        LC_COLLATE=en_US.UTF-8    
##  [5] LC_MONETARY=en_US.UTF-8    LC_MESSAGES=en_US.UTF-8   
##  [7] LC_PAPER=en_US.UTF-8       LC_NAME=C                 
##  [9] LC_ADDRESS=C               LC_TELEPHONE=C            
## [11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C       
## 
## attached base packages:
## [1] stats     graphics  grDevices utils     datasets  methods   base     
## 
## other attached packages:
##  [1] forcats_0.5.0             stringr_1.4.0            
##  [3] dplyr_0.8.5               purrr_0.3.3              
##  [5] readr_1.3.1               tidyr_1.0.2              
##  [7] tibble_2.1.3              tidyverse_1.3.0          
##  [9] Phenoflow_1.1.2           foreach_1.5.0            
## [11] flowAI_1.16.0             flowFDA_0.99             
## [13] mclust_5.4.5              multcomp_1.4-13          
## [15] TH.data_1.0-10            MASS_7.3-51.5            
## [17] survival_3.1-12           mvtnorm_1.0-11           
## [19] flowFP_1.44.0             flowViz_1.50.0           
## [21] lattice_0.20-41           flowClean_1.24.0         
## [23] cowplot_1.0.0             scales_1.1.0             
## [25] ggcyto_1.14.0             flowWorkspace_3.34.0     
## [27] ncdfFlow_2.32.0           BH_1.69.0-1              
## [29] RcppArmadillo_0.9.850.1.0 ggplot2_3.2.1            
## [31] flowCore_1.52.1          
## 
## loaded via a namespace (and not attached):
##   [1] readxl_1.3.1         changepoint_2.2.2    backports_1.1.5     
##   [4] plyr_1.8.4           igraph_1.2.5         lazyeval_0.2.2      
##   [7] splines_3.6.2        digest_0.6.23        htmltools_0.4.0     
##  [10] magrittr_1.5         cluster_2.1.0        sfsmisc_1.1-6       
##  [13] recipes_0.1.10       Biostrings_2.54.0    modelr_0.1.6        
##  [16] gower_0.2.1          RcppParallel_5.0.0   matrixStats_0.55.0  
##  [19] sandwich_2.5-1       jpeg_0.1-8.1         colorspace_1.4-1    
##  [22] rvest_0.3.5          haven_2.2.0          xfun_0.12           
##  [25] crayon_1.3.4         jsonlite_1.6         hexbin_1.28.1       
##  [28] graph_1.64.0         zeallot_0.1.0        zoo_1.8-7           
##  [31] iterators_1.0.12     ape_5.3              glue_1.3.1          
##  [34] gtable_0.3.0         ipred_0.9-9          zlibbioc_1.32.0     
##  [37] XVector_0.26.0       phyloseq_1.30.0      IDPmisc_1.1.20      
##  [40] Rgraphviz_2.30.0     Rhdf5lib_1.8.0       BiocGenerics_0.32.0 
##  [43] DBI_1.1.0            Rcpp_1.0.3           bit_1.1-15.2        
##  [46] stats4_3.6.2         lava_1.6.7           prodlim_2019.11.13  
##  [49] httr_1.4.1           RColorBrewer_1.1-2   farver_2.0.1        
##  [52] pkgconfig_2.0.3      nnet_7.3-13          dbplyr_1.4.2        
##  [55] caret_6.0-86         labeling_0.3         tidyselect_0.2.5    
##  [58] rlang_0.4.2          reshape2_1.4.3       munsell_0.5.0       
##  [61] cellranger_1.1.0     tools_3.6.2          cli_1.1.0           
##  [64] generics_0.0.2       ade4_1.7-15          broom_0.5.5         
##  [67] evaluate_0.14        biomformat_1.14.0    yaml_2.2.0          
##  [70] fs_1.3.1             ModelMetrics_1.2.2.2 knitr_1.28          
##  [73] nlme_3.1-145         xml2_1.2.2           rstudioapi_0.10     
##  [76] compiler_3.6.2       png_0.1-7            reprex_0.3.0        
##  [79] stringi_1.4.3        Matrix_1.2-18        vegan_2.5-6         
##  [82] permute_0.9-5        multtest_2.42.0      vctrs_0.2.0         
##  [85] pillar_1.4.2         lifecycle_0.1.0      data.table_1.12.8   
##  [88] R6_2.4.1             latticeExtra_0.6-29  KernSmooth_2.23-16  
##  [91] gridExtra_2.3        IRanges_2.20.2       codetools_0.2-16    
##  [94] boot_1.3-24          assertthat_0.2.1     rhdf5_2.30.1        
##  [97] withr_2.1.2          S4Vectors_0.24.3     mgcv_1.8-31         
## [100] parallel_3.6.2       hms_0.5.2            grid_3.6.2          
## [103] rpart_4.1-15         timeDate_3043.102    class_7.3-16        
## [106] rmarkdown_2.1        pROC_1.16.2          Biobase_2.46.0      
## [109] lubridate_1.7.8
print(version)
##                _                           
## platform       x86_64-pc-linux-gnu         
## arch           x86_64                      
## os             linux-gnu                   
## system         x86_64, linux-gnu           
## status                                     
## major          3                           
## minor          6.2                         
## year           2019                        
## month          12                          
## day            12                          
## svn rev        77560                       
## language       R                           
## version.string R version 3.6.2 (2019-12-12)
## nickname       Dark and Stormy Night